package com.ccit.greenlife.controller;

import com.ccit.greenlife.Mapper.UserMapper;
import com.ccit.greenlife.pojo.ApiResponse;
import com.ccit.greenlife.pojo.Result;
import com.ccit.greenlife.pojo.User;
import com.ccit.greenlife.service.UserService;
import com.ccit.greenlife.service.impl.EmailServiceImpl;
import com.ccit.greenlife.utils.JwtUtil;
import com.ccit.greenlife.utils.Md5Util;
import com.ccit.greenlife.utils.ThreadLocalUtil;
import jakarta.validation.constraints.Pattern;
import org.hibernate.validator.constraints.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController//标识类作为控制器（Controller），并且该控制器的所有方法返回的数据直接作为HTTP响应的正文返回，而不是返回一个视图（View）
@RequestMapping("/user")
public class UserController {
    @Autowired//Spring 容器在创建对象时会自动注入相应的依赖
    private UserService userService;
    @Autowired//redis提供服务的对象
    private StringRedisTemplate stringRedisTemplate;
/*    @Autowired//邮箱验证对象
    private EmailServiceImpl emailService;*/
    @Value("${basePath}")
    private String basePath;// 图片的基地址

    //保存图片并返回保存地址
    public String saveImage(MultipartFile pictureFile) {
        String fileName = pictureFile.getOriginalFilename();//获取上传文件的原始文件名
        System.out.println(basePath);
        String filePath = basePath + "/Avatar/" + fileName;//构建了文件的存储路径
        File dest = new File(filePath);
        try {
            pictureFile.transferTo(dest); // 保存文件
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return "/static/Avatar/" + fileName; // 返回前端访问时的路径
    }

    // 注册接口
    @PostMapping("/register")
    public ResponseEntity<ApiResponse> register(@RequestBody User user) {
        System.err.println("用户注册信息：" + user);
        try {
            userService.register(user.getUsername(), user.getPassword(), user.getEmail());
            ApiResponse response = new ApiResponse(1, "注册成功", null);
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            System.err.println("注册失败：" + e.getMessage());
            ApiResponse response = new ApiResponse(0, e.getMessage(), null);
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
        }
    }
    /*@PostMapping("/register")
    public String register(@RequestBody User user) {
        try {
            userService.register(user.getUsername(), user.getPassword(), user.getEmail());
            return "{ \"code\": 1, \"message\": \"注册成功\" }";
        } catch (Exception e) {
            return "{ \"code\": 0, \"message\": \"" + e.getMessage() + "\" }";
        }
    }*/

    /*//点击验证按钮获取验证码
    @PostMapping("/code")
    public Result sendVerificationCode(String email) {
        // 生成验证码
        String code = getCode();
        System.out.println("用户邮箱" + email);
        // 发送验证码到用户邮箱
        emailService.sendEmail(email, "您的验证码是", "您的验证码是：" + code);

        // 存储验证码（可以使用 Redis 或内存存储）
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();// 获取ValueOperations对象
        operations.set(email, code, 5, TimeUnit.MINUTES);// 将字符串值设置到Redis中，键email值code,过期时间为5min

        return Result.success("验证码已发送");
    }
    //验证码随机生成
    private String getCode() {
        // 生成一个随机的六位数字验证码
        return String.valueOf((int) (Math.random() * 900000) + 100000);
    }*/

   

    //登录
    @GetMapping("/login")
    //接收的请求数据是通过表单提交的，可以直接获取具体属性而不是json格式数据
    public Result<String> login(String username, String password){
        //查询用户
        User loginuser;
        loginuser = userService.findByUsername(username);
        if (loginuser == null){
            return Result.error("用户名错误");
        }
        //1.加密，对比加密后的密码和数据库储蓄的是否一致,一致则登录成功生成一个token供后续操作
        String encryptedPassword = Md5Util.md5(password);

        //2.将token存入redis(后续服务需要验证token合法性且存在redis中(修改密码时删除，退至登陆界面从而重新生成))
        //3.如果一致，返回一个token供后续所有操作

        System.out.println("用户输入密码"+password);
        System.out.println("数据库密码"+loginuser.getPassword());
        //1.
        if(encryptedPassword.equals(loginuser.getPassword())){
            return Result.success();
        }
        return Result.error("密码错误");
    }

    //更新密码(用户id和账户都是唯一的)
    @PatchMapping("/updatePwd")
    public Result updatePwd(@RequestBody Map<String, String> params, @RequestHeader("Authorization") String token){
        //1.检验参数
        String oldPwd = params.get("old_pwd");
        String newPwd = params.get("new_pwd");
        String rePwd = params.get("re_pwd");
        //必须都存在
        if(!StringUtils.hasLength(oldPwd) || !StringUtils.hasLength(newPwd) || !StringUtils.hasLength(rePwd)){
            return Result.error("缺少必要参数");
        }
        //2.验证原密码是否正确
        Map<String, Object> map = ThreadLocalUtil.get();
        String username = (String) map.get("username");
        User user = userService.findByUsername(username);
        if(!user.getPassword().equals(Md5Util.md5(oldPwd))){
            return Result.error("原密码错误");
        }
        //3.两次密码是否相同
        if(!newPwd.equals(rePwd)){
            return Result.error("两次密码不一致");
        }
        //4.修改密码
        // 且删除redis中旧token
        userService.updatePwd(newPwd);
        //删除旧token
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();// 获取ValueOperations对象
        operations.getOperations().delete(token);
        return Result.success();
    }

    //获取用户个人信息
    @GetMapping("/userinfo")
    public Result getUserInfo(){
        Map<String, Object> map = ThreadLocalUtil.get();
        String id = (String) map.get("id");
        User user = userService.getUserInfo(id);
        return Result.success(user);
    }

    //更新头像
    @PatchMapping("/updateAvatar")
    public Result updateAvatar(@RequestParam("Avatar") MultipartFile AvatarFile){
        // 保存图片并获取路径
        String Avatar = saveImage(AvatarFile);
        if (Avatar == null) {
            return Result.error("图片上传失败");
        }

        // 保存产品信息
        userService.updateAvatar(Avatar);
        return Result.success("头像更新成功");
    }

    //更新用户信息
    @PatchMapping("/updateInfo")
    public Result updateInfo(@RequestBody User user){
        userService.updateInfo(user);
        return Result.success("更新成功");
    }
}
